#pragma region  【算法5 - 9】用Prim 算法构造无向连通网的最小生成树
#define MAXCOST … //定义MAXCOST为一个足够大的常量值
void Prim(int gm[N][N], int tree[N], int cost[N])
{
    //从序号为0的顶点出发，建立连通网的最小生成树，二维数组gm[N][N]是其邻接矩阵
    //顶点编号依次为0..N-1，建立的最小生成树存于数组tree中，对应的边值在cost中
    int flag[N] = {0};
    int i, j, k, mincost;
    for (i = 0; i < N; i++)
    {
        cost[i] = gm[0][i]; //从存储序号为0的顶点出发生成最小生成树
        tree[i] = 0;
    }
    flag[0] = 1;
    for (i = 1; i < N; i++) // N -1次循环，寻找当前最小权值的边
    {
        mincost = MAXCOST;
        for (j = 1; j < N; j++)
        {
            if (flag[j] == 0 && cost[j] < mincost)
            {
                mincost = cost[j];
                k = j;
            } //记忆最小的边
        }
        flag[k] = 1;            // k进入了U集合
        for (j = 1; j < N; j++) //是否用新点k连通不在U的顶点
            if (flag[j] == 0 && gm[k][j] < cost[j])
            {
                cost[j] = gm[k][j];
                tree[j] = k;
            }
    }
}
#pragma endregion